/*
 * Server.cpp
 *
 */

#include "Server.h"

Server::Server(const ServerConfig& config, LogFile& logFile) :
	acceptor(config.getWebPort()),
	config(config),
	logFile(logFile),
	clientHandler(config, logFile) {
}

Server::~Server() {
	shutdown();
}

void Server::run() {
	while (!isDead()) {
		try {
			// Espero a que haya lugar
			clientHandler.waitForRoom();
			// Escucho por conexiones
			Socket* sock = acceptor.accept();
			// Agrego o descarto al cliente
			clientHandler.addNewClient(sock);
		}
		catch (const SocketException& e) {
			if(!isDead()) {
				// La excepción fue por un fallo desconocido en serverSocket
				logFile.addError("Fallo en el web server socket.");
				die();
			}
		}
	}
}

void Server::start() {
	Thread::start();
	clientHandler.start();
}

void Server::shutdown() {
	// Deshabilito flag de aceptación de clientes del server
	die();

	// Deshabilito manejador de clientes para que no recepcione y mate clientes
	clientHandler.die();

	// Espero que se maten todos los clientes
	clientHandler.join();

	// Cierro aceptor de clientes
	acceptor.shutdown();
	acceptor.close();

	// Espero finalización del servidor
	join();
}
